#include "pixd/pixdmanager.h"


/********************************
 *      Public
 ********************************/

    /********************************
     *      Constructors
     ********************************/

        PixDManager::PixDManager()
        {}

        void PixDManager::Initialize(){
            // Je commence par créer la MainWindow, vide, de manière à ce que les différents
            // managers puissent initialiser leurs actions
            m_MainWindow        =   new MainWindow();
            m_Model             =   new QStandardItemModel();

            LoadRecentsProjects();
            CreateActions();
            CreateDockWidget();
            CreateMainWindow();
            CreateMenu();
            CreateProjectWidget();
        }

    /********************************
     *      Methods
     ********************************/

/********************************
 *      Private
 ********************************/

    /********************************
     *      Menu
     ********************************/

        void PixDManager::CreateMenu(){
            m_MainWindow->menuBar()->addMenu(GetFileMenu());
            m_MainWindow->menuBar()->addMenu(GetProjectMenu());
        }

        QMenu * PixDManager::GetFileMenu(){
            QMenu * menu = new QMenu("File");
            menu->addAction(m_NewProject);
            menu->addAction(m_OpenProject);
            menu->addAction(m_SaveProject);
            menu->addAction(m_SaveProjectAs);
            menu->addMenu(GetRecentProjectsMenu());
            return menu;
        }

        QMenu * PixDManager::GetProjectMenu(){
            QMenu * menu = new QMenu("Project");
            menu->addAction(m_NewAtlas);
            return menu;
        }

        QMenu * PixDManager::GetRecentProjectsMenu(){
            QMenu * menu = new QMenu("Recents Projects");

            for(int i=0; i< m_RecentsProjects.size();i++)
            {
                ActionFile * actionFile = new ActionFile(m_RecentsProjects[i], m_MainWindow, m_RecentsProjects[i]);
                connect(actionFile, SIGNAL(FileTriggered(string)), this, SLOT(OpenProject(string)));
                menu->addAction(actionFile);
            }

            return menu;
        }

    /********************************
     *      Methods
     ********************************/

        void PixDManager::CreateMainWindow(){
            // Je modifie la taille de la fenêtre principale
            m_MainWindow->resize(1000,600);
            // J'ajoute un widget vide à l'intérieur de la fenêtre pour que cette dernière s'affiche
            m_MainWindow->setCentralWidget(new QWidget());

            m_MainWindow->show();
        }

        void PixDManager::CreateActions(){
            m_NewProject    =   new QAction("New Project",      m_MainWindow);
            m_OpenProject   =   new QAction("Open Project",     m_MainWindow);
            m_SaveProject   =   new QAction("Save Project",     m_MainWindow);
            m_SaveProjectAs =   new QAction("Save Project As",  m_MainWindow);
            m_Quit          =   new QAction("Quit",             m_MainWindow);

            connect(m_NewProject,       SIGNAL(triggered()), this, SLOT(CreateNewProject()));
            connect(m_OpenProject,      SIGNAL(triggered()), this, SLOT(OpenProject()));
            connect(m_SaveProject,      SIGNAL(triggered()), this, SLOT(SaveProject()));
            connect(m_SaveProjectAs,    SIGNAL(triggered()), this, SLOT(SaveProjectAs()));
            connect(m_Quit,             SIGNAL(triggered()), m_MainWindow, SLOT(close()));

            m_NewAtlas      =   new QAction("New Atlas", m_MainWindow);
        }

        QWidget * PixDManager::ReturnView(){
             QProjectView* view    =   new QProjectView();

             connect(view, SIGNAL(customContextMenuRequested(QPoint)), view, SLOT(CustomMenu(QPoint)));

             view->setModel(m_Model);
             ConnectView(view);

             return view;
        }

        void PixDManager::CreateProjectWidget(){
            QDockWidget * dock = new QDockWidget();
            dock->setWidget(ReturnView());
            m_MainWindow->addDockWidget(Qt::LeftDockWidgetArea, dock);
        }


        void PixDManager::CreateDockWidget(){
            m_InspectorWidget   = new QDockWidget();
            m_MainWindow->addDockWidget(Qt::RightDockWidgetArea, m_InspectorWidget);

            //connect(m_AtlasManager,SIGNAL(ImagesUpdated(vector<QString>)), m_DockAtlas, SLOT(UpdateImageLoaded(vector<QString>)));
        }

        void PixDManager::SetCentralWidget(QWidget *widget)
        {
            m_MainWindow->setCentralWidget(widget);
        }

   /********************************************
    *              Private
    ********************************************/

       /********************************************
        *              Methods
        ********************************************/

            void PixDManager::ConnectView(QTreeView * view){
               QObject::connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(ViewDoubleCkicked(QModelIndex)));
               QObject::connect(view, SIGNAL(clicked(QModelIndex)), this, SLOT(ViewClicked(QModelIndex)));
            }

            void PixDManager::LoadRecentsProjects(){
            // Je commence par ouvrir le fichier contenant la liste des projets crées
               ifstream recentsProjectsFile("RecentsProjects", ifstream::in | ifstream::out);

               // Le fichier est formaté de manière à ce que chaque ligne corresponde à un projet, avec une première chaine pour le nom
               // du projet, et une deuxième pour son chemin
               string  name;

               while(recentsProjectsFile>> name){
                   m_RecentsProjects.push_back(name);
               }

               recentsProjectsFile.close();
           }

       /********************************************
        *              Slots
        ********************************************/

           //Creation slots
           void PixDManager::CreateNewProject(){
               NewProject * newProject = new NewProject();
               connect( newProject, SIGNAL(ProjectCreated(Project*)), this, SLOT(ProjectCreated(Project*)));
               newProject->show();
           }

           void PixDManager::ProjectCreated(Project *proj){
               // Je rajoute le nouveau projet à l'intérieur du modèle pour visualisation, et dans un vector
               // pour l'accéder
                m_ProjectsOpened.push_back(proj);

                m_Model->appendRow(proj->m_Item);

               // Egalement, je met son "fichier" dans la liste des fichiers récents, et je met à jour cette liste

                string gigapath =   proj->Path()+"\\"+proj->Name();

                int found =-1;
                int i=0;

                while( found==-1 && i< m_RecentsProjects.size()){
                    if(m_RecentsProjects[i]== gigapath){
                        found=i;
                    }
                    i++;
                }

                if(found!=-1){
                    m_RecentsProjects.erase(m_RecentsProjects.begin()+found);
                    m_RecentsProjects.insert(m_RecentsProjects.begin(), gigapath);
                }else{
                    m_RecentsProjects.insert(m_RecentsProjects.begin(), gigapath);
                }

                proj->Save();
                UpdateRecentsProjects();
           }

           void PixDManager::OpenProject(string path){
               Project * proj  =   new Project();
               proj->Load(path+".xml");

              m_ProjectsOpened.push_back(proj);
              m_Model->appendRow(proj->m_Item);
           }

           void PixDManager::SaveProject(){
               Project::CurrentProject().Save();
           }

           void PixDManager::SaveProjectAs(){

           }


           void PixDManager::SetInspectorWidget(QWidget * widget){
                m_InspectorWidget->setWidget(widget);
           }

           void PixDManager::SetToolWidget(QWidget * widget){

           }


           void PixDManager::ViewDoubleCkicked(const QModelIndex index){
                ComponentItem * comp = (ComponentItem *) m_Model->itemFromIndex(index);
                comp->m_Component->DoubleClicked();
           }

           void PixDManager::ViewClicked(const QModelIndex index){
               ComponentItem * comp = (ComponentItem *) m_Model->itemFromIndex(index);
               comp->m_Component->Clicked();
           }

           void PixDManager::UpdateRecentsProjects(){
               ofstream fileRecentsProjets ("RecentsProjects", ofstream::out | ofstream::trunc);

               for(int i=0; i< m_RecentsProjects.size();i++){
                   fileRecentsProjets<< m_RecentsProjects[i]<<"\n";
               }
               fileRecentsProjets.close();
           }

           void PixDManager::ShowAtlas(Atlas *m_Atlas){
               Canvas * canvas = new Canvas(m_Atlas->m_Scene, m_MainWindow,m_Atlas->Width(),m_Atlas->Height());
               m_MainWindow->setCentralWidget(canvas);
           }

